package W333;

/**
 * @author zxc
 * @date 2023/02/19 10:33
 **/

import java.util.ArrayList;
import java.util.List;

/**
 * 题目 ：合并二维数组 - 求和法
 * 题目详述 ：
 * 给你两个 二维 整数数组 nums1 和 nums2.
 * nums1[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。
 * nums2[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。
 * 每个数组都包含 互不相同 的 id ，并按 id 以 递增 顺序排列。
 * 请你将两个数组合并为一个按 id 以递增顺序排列的数组，并符合下述条件：
 * 只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。
 * 每个 id 在结果数组中 只能出现一次 ，并且其对应的值等于两个数组中该 id 所对应的值求和。
 * 如果某个数组中不存在该 id ，则认为其对应的值等于 0 。
 * 返回结果数组。返回的数组需要按 id 以递增顺序排列。
 *
 * 提示：
 * 1 <= nums1.length, nums2.length <= 200
 * nums1[i].length == nums2[j].length == 2
 * 1 <= idi, vali <= 1000
 * 数组中的 id 互不相同
 * 数据均按 id 以严格递增顺序排列
 *
 */
public class MergeArrays {
    public static void main(String[] args) {
        mergeArrays(new int[][]{{1,2},{2,3},{4,5}} ,new int[][]{{1,4},{3,2},{4,1}});
    }
    /**
     * 思路 ：
     * 即，双指针p1 和 p2分别指向nums1数组和nums2数组中的元素
     * （1）由于两个数组nums1和nums2中元素是递增的，所以逐步指向即可;
     * （2）即，将两个数组中，id较小的，首先放入到结果数组result中去;
     * （3）特殊情况 ：即，指针p1和指针p2所指向的nums1和nums2数组中，元素id是一致的;
     *  ===> 即，双指针同时后移，同时将 累加结果加入到结果数组中去;
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[][] mergeArrays(int[][] nums1, int[][] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        List<int[]> list = new ArrayList<>();
        int p1 = 0;
        int p2 = 0;
        // while循环结束条件 ：
        while(p1 < len1 && p2 < len2){
            if(nums1[p1][0] < nums2[p2][0]){
                list.add(new int[]{nums1[p1][0] , nums1[p1][1]});
                p1++;
            }
            else if(nums2[p2][0] < nums1[p1][0]){
                list.add(new int[]{nums2[p2][0] , nums2[p2][1]});
                p2++;
            }
            else {
                list.add(new int[]{nums1[p1][0] , nums1[p1][1] + nums2[p2][1]});
                p1++;
                p2++;
            }
        }
        while (p1 < len1){
            list.add(new int[]{nums1[p1][0] , nums1[p1][1]});
            p1++;
        }
        while (p2 < len2){
            list.add(new int[]{nums2[p2][0] , nums2[p2][1]});
            p2++;
        }
        int len = list.size();
        int[][] result = new int[len][2];
        int k = 0;
        for (int[] dp : list) {
            result[k][0] = dp[0];
            result[k][1] = dp[1];
            k++;
        }
        return result;
    }
}
